// This example illustrates how C++ classes can be used from Java using SWIG.
// The Java class gets mapped onto the C++ class and behaves as if it is a Java class.

public class runme {
	static {
		try {
			// System.loadLibrary("example");
			System.load("/home/hbui/sw/swig-2.0.7/Examples/java/class/libexample.so");
		} catch (UnsatisfiedLinkError e) {
			System.err
					.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n"
							+ e);
			System.exit(1);
		}
	}

	public static void main(String argv[]) {
		// ----- Object creation -----

		System.out.println("Creating some objects:");
		Circle c = new Circle(10);
		System.out.println("    Created circle " + c);
		Square s = new Square(10);
		System.out.println("    Created square " + s);

		// ----- Access a static member -----

		System.out.println("\nA total of " + Shape.getNshapes() + " shapes were created");

		// ----- Member data access -----

		// Notice how we can do this using functions specific to
		// the 'Circle' class.
		c.setX(20);
		c.setY(30);

		// Now use the same functions in the base class
		Shape shape = s;
		shape.setX(-10);
		shape.setY(5);

		System.out.println("\nHere is their current position:");
		System.out.println("    Circle = (" + c.getX() + " " + c.getY() + ")");
		System.out.println("    Square = (" + s.getX() + " " + s.getY() + ")");

		// ----- Call some methods -----

		System.out.println("\nHere are some properties of the shapes:");
		Shape[] shapes = { c, s };
		for (int i = 0; i < shapes.length; i++) {
			System.out.println("   " + shapes[i].toString());
			System.out.println("        area      = " + shapes[i].area());
			System.out.println("        perimeter = " + shapes[i].perimeter());
		}

		// Notice how the area() and perimeter() functions really
		// invoke the appropriate virtual method on each object.

		// ----- Delete everything -----

		System.out.println("\nGuess I'll clean up now");

		// Note: this invokes the virtual destructor
		// You could leave this to the garbage collector
		c.delete();
		s.delete();

		System.out.println(Shape.getNshapes() + " shapes remain");
		System.out.println("Goodbye");
	}
}
